package cn.demoncat.util.qr;

import com.google.zxing.client.j2se.MatrixToImageConfig;

import cn.demoncat.util.io.ColorUtil;

/**
 * QR生成参数
 * 
 * @author 延晓磊
 *
 * @since 2018年10月31日
 */
public class QrParam {

	// 二维码图片宽度(宽度==高度)，默认500
	private Integer width;
	// 二维码边框偏移，默认2，随宽度增加
	private Integer margin;
	// 二维码前景色：默认黑色 "#000000"
	private String masterColor;
	// 二维码前景色数值，默认黑色
	private Integer masterColorNum;
	// 二维码背景色：默认白色 "#FFFFFF"
	private String slaveColor;
	// 二维码背景色数值，默认白色
	private Integer slaveColorNum;
	// LOGO比例，默认0.2，最大0.36
	private Double ratio;
	// LOGO圆角，默认width/50
	private Integer radius;
	// LOGO边框，默认width/100
	private Integer stroke;

	public QrParam() {
		super();
	}

	/**
	 * 二维码生成参数
	 * 
	 * @param width 		宽度(宽度==高度)
	 */
	public QrParam(Integer width) {
		super();
		this.width = width;
	}

	/**
	 * 二维码生成参数
	 * 
	 * @param width 		宽度(宽度==高度)
	 * @param margin 		边框偏移
	 */
	public QrParam(Integer width, Integer margin) {
		super();
		this.width = width;
		this.margin = margin;
	}

	/**
	 * 二维码生成参数
	 * 
	 * @param width 		宽度(宽度==高度)
	 * @param masterColor	前景色：RGB码，如"#000000"
	 * @param slaveColor	背景色：RGB码，如"#FFFFFF"
	 */
	public QrParam(Integer width, String masterColor, String slaveColor) {
		super();
		this.width = width;
		this.masterColor = masterColor;
		this.slaveColor = slaveColor;
	}

	/**
	 * 二维码生成参数
	 * 
	 * @param width 		宽度(宽度==高度)
	 * @param margin 		边框偏移
	 * @param masterColor	前景色：RGB码，如"#000000"
	 * @param slaveColor	背景色：RGB码，如"#FFFFFF"
	 */
	public QrParam(Integer width, Integer margin, String masterColor, String slaveColor) {
		super();
		this.width = width;
		this.margin = margin;
		this.masterColor = masterColor;
		this.slaveColor = slaveColor;
	}

	/**
	 * 二维码生成参数
	 * 
	 * @param width 		宽度(宽度==高度)
	 * @param ratio			LOGO比例
	 * @param radius		LOGO圆角
	 * @param stroke		LOGO边框 
	 */
	public QrParam(Integer width, Double ratio, Integer radius, Integer stroke) {
		super();
		this.width = width;
		this.ratio = ratio;
		this.radius = radius;
		this.stroke = stroke;
	}

	/**
	 * 二维码生成参数
	 * 
	 * @param width 		宽度(宽度==高度)
	 * @param margin 		边框偏移
	 * @param ratio			LOGO比例
	 * @param radius		LOGO圆角
	 * @param stroke		LOGO边框 
	 */
	public QrParam(Integer width, Integer margin, Double ratio, Integer radius, Integer stroke) {
		super();
		this.width = width;
		this.margin = margin;
		this.ratio = ratio;
		this.radius = radius;
		this.stroke = stroke;
	}

	/**
	 * 二维码生成参数
	 * 
	 * @param width 		宽度(宽度==高度)
	 * @param masterColor	前景色：RGB码，如"#000000"
	 * @param slaveColor	背景色：RGB码，如"#FFFFFF"
	 * @param ratio			LOGO比例
	 * @param radius		LOGO圆角
	 * @param stroke		LOGO边框 
	 */
	public QrParam(Integer width, String masterColor, String slaveColor, Double ratio, Integer radius, Integer stroke) {
		super();
		this.width = width;
		this.masterColor = masterColor;
		this.slaveColor = slaveColor;
		this.ratio = ratio;
		this.radius = radius;
		this.stroke = stroke;
	}

	/**
	 * 二维码生成参数
	 * 
	 * @param width 		宽度(宽度==高度)
	 * @param margin 		边框偏移
	 * @param masterColor	前景色：RGB码，如"#000000"
	 * @param slaveColor	背景色：RGB码，如"#FFFFFF"
	 * @param ratio			LOGO比例
	 * @param radius		LOGO圆角
	 * @param stroke		LOGO边框 
	 */
	public QrParam(Integer width, Integer margin, String masterColor, String slaveColor, Double ratio, Integer radius, Integer stroke) {
		super();
		this.width = width;
		this.margin = margin;
		this.masterColor = masterColor;
		this.slaveColor = slaveColor;
		this.ratio = ratio;
		this.radius = radius;
		this.stroke = stroke;
	}

	public int getWidth() {
		if (width == null || width <= 0) {
			width = QrConstant.WIDTH;
		}
		return width;
	}

	public void setWidth(int width) {
		this.width = width;
	}

	public int getMargin() {
		if (margin == null || margin <= 0) {
			// 每500宽度+2
			if (getWidth() < 500) {
				return 2;
			} else {
				return getWidth() / 500 * 2;
			}
		}
		return margin;
	}

	public void setMargin(int margin) {
		this.margin = margin;
	}

	public String getMasterColor() {
		return masterColor;
	}

	public void setMasterColor(String masterColor) {
		this.masterColor = masterColor;
	}

	public int getMasterColorNum() {
		if (masterColorNum == null) {
			if (getMasterColor() != null) {
				masterColorNum = ColorUtil.getColorNum(getMasterColor());
			}else {
				masterColorNum = MatrixToImageConfig.BLACK;
			}
		}
		return masterColorNum;
	}

	public String getSlaveColor() {
		return slaveColor;
	}

	public void setSlaveColor(String slaveColor) {
		this.slaveColor = slaveColor;
	}

	public int getSlaveColorNum() {
		if (slaveColorNum == null) {
			if (getSlaveColor() != null) {
				slaveColorNum = ColorUtil.getColorNum(getSlaveColor());
			}else {
				slaveColorNum = MatrixToImageConfig.WHITE;
			}
		}
		return slaveColorNum;
	}

	public double getRatio() {
		if (ratio == null || ratio <= 0 || ratio > QrConstant.LOGO_RATIO_MAX) {
			ratio = QrConstant.LOGO_RATIO;
		}
		return ratio;
	}

	public void setRatio(double ratio) {
		this.ratio = ratio;
	}

	public int getRadius() {
		if (radius == null || radius < 0) {
			radius = getWidth()/50;
		}
		return radius;
	}

	public void setRadius(int radius) {
		this.radius = radius;
	}

	public int getStroke() {
		if (stroke == null || stroke < 0) {
			stroke = getWidth()/100;
		}
		return stroke;
	}

	public void setStroke(int stroke) {
		this.stroke = stroke;
	}
	
}
